package com.example.spring_demo.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 *循环依赖:
 * 1、通过构建函数创建A对象（A对象是半成品，还没注入属性和调用init方法）。
 * 2、A对象需要注入B对象，发现缓存里还没有B对象，将半成品对象A放入半成品缓存。
 * 3、通过构建函数创建B对象（B对象是半成品，还没注入属性和调用init方法）。
 * 4、B对象需要注入A对象，从半成品缓存里取到半成品对象A。
 * 5、B对象继续注入其他属性和初始化，之后将完成品B对象放入完成品缓存。
 * 6、A对象继续注入属性，从完成品缓存中取到完成品B对象并注入。
 * 7、A对象继续注入其他属性和初始化，之后将完成品A对象放入完成品缓存。
 * @author cxx
 * @create 2020-10-26 17:26
 **/
@Component
public class A {

    @Autowired
    private B b;

    private String name;

    @PostConstruct
    public void init(){
        this.name = "i am a";
        b.say();
    }

    public String getName() {
        return name;
    }
}
